/*
*	Project: Aethon
*
*	File: StageHand.h
*
*	Author: Caleb Reinking
*
*	Date: 2/15/2009
*
*   Purpose: The stage hand is the command console that will be used during
*            gameplay. It will be used to debug and report information as well
*            as control certain settings such as visibility and collisions.
*            StageHand Class Specification File
*/

#ifndef STAGEHAND_HEADER
#define STAGEHAND_HEADER

#define MAX_CMD_LENGTH 100

#include "../include/Scene.h"
#include "../include/Control.h"

#include<string>
#include <GL/glut.h>
#include <math.h>
#include <vector>
#include <string>
#include <ctype.h>

using namespace std;

//#############################################################################
class StageHand{

    private:
       bool isActive;
       int* handlerNumberPtr;//used to tell director which handler to register
       Scene* scenePtr;	
       static StageHand* pinstance; 
       string buffer; 
       vector<string> commandList;
       string commandBuffer;
       char* cmdBufChar;
	
	protected:
        //------------------- constructors ----------------------------------------
		//##########################################################################
		StageHand()
		{
           cmdBufChar = new char[MAX_CMD_LENGTH];
		   isActive = false;
		   commandList.push_back( "This is Aethon!" );
		}
	
	    //singleton pattern based on http://www.inquiry.com/techtips/cpp_pro/10min/10min0200.asp
	    StageHand(const StageHand&);//protect operations so instances are limited
	    StageHand& operator = (const StageHand&);//protect operations so instances are limited
	    
	public:	
	    static StageHand* getInstanceOf();//returns instance of StageHand 
	   
	    //------------------- gets and sets ---------------------------------------
		//##########################################################################
		void setIsActive( bool active ) 
		{
			 isActive = active;
		}//end setIsActive
			
		//##########################################################################
		bool getIsActive() 
		{
			 return isActive;
		}//end getIsActive
		
		//######################################################################
		void setHandleNumberPtr(int* ptr)
	    {
           handlerNumberPtr = ptr;
        }//end setHandlePtr

        //######################################################################
     	int* getHandleNumberPtr()
	    {
           return handlerNumberPtr;
        }//end setHandlePtr
        
        //######################################################################
        void setScenePtr( Scene* ptr )
        {
           scenePtr = ptr;
        }//end setScenePtr
        
        //######################################################################
        Scene* getScenePtr()
        {
           return scenePtr;
        }//end getScenePtr
        
        //######################################################################
        string getLastCommand()
        {
           return commandList.back();
        }//end getLastCommand
		
		//######################################################################
		vector<string> getCommandList()
		{
            return commandList;
        }//end getCommandList
        
        //######################################################################
        string getCommandBuffer()
        {
            return commandBuffer;
        }//end getCommandBuffer
        
        //######################################################################
        void setCommandBuffer( string newComBuf )
        {
             commandBuffer = newComBuf;
        }//end setCommandBuffer
		
		//######################################################################
		void pushCommand( string command )
		{
           commandList.push_back( command );
        }//end pushCommand
        
		//######################################################################
		static void keyboardHandle(unsigned char key, int x, int y);
	    static void specialHandle(int key, int x, int y);
		char specialHandle();
		void display(int windowHeight, int windowWidth);
		void commandParser(string parseStr);
		void executeCommand( string cmdTokens);
        void drawOverlay(int windowHeight, int windowWidth );
        void viewPerspective(void);
        void viewOrtho(int x, int y);
        void printText(void *font, float x, float y, string textStr);
        void printConsole();
	
};//end class

#endif //STAGEHAND_HEADER

